#include <stdio.h>
#include<stdlib.h>
#include<string.h>

void wh(void);//信息维护
void cx(void);//信息查询
void tj(void);//成绩统计
void px(void);
void pxc(int d);
void pxm(int d);
void pxe(int d);//排序
void add(void);//子系统 信息添加
void del(void);//子系统 信息删除
void xg(void);//子系统 信息修改
void shuru(void);//成绩输入
void bc(void);//
struct student
{
    char name[10];
    char number[20];
    int chinese,math,english;

}stu[200],x[200],y;
int n=0,m=0;
char mu[200];

int main()
{
    int a;
    
    printf("请输入该目录下需要导入的学生目录");
    scanf("%s",mu);
    shuru();
    
    for(;;)
    {
        printf("***************************欢迎使用成绩管理系统******************************\n\n");
        printf("1.信息维护\n\n2.信息查询\n\n3.成绩统计\n\n4.排序\n\n0.退出\n\n");
        printf("****************************************************************************\n\n");
        printf("请选择需要执行的类型");

        scanf("%d",&a);

        if(a==1) wh();
        else if(a==2) cx();
        else if(a==3) tj();
        else if(a==4) px();
        else if(a==0) break;
        else printf("您的输入有误，请重新输入\n");
    }
}

void wh(void)//信息维护
{
    int a;
    for(;;)
    {
        printf("***************************欢迎使用信息维护功能******************************\n\n");
        printf("1.增加学生信息\n\n2.删除学生信息\n\n3.修改学生信息\n\n4.保存文件\n\n0.退出\n\n");
        printf("****************************************************************************\n\n");
        printf("请选择需要执行的类型");

        scanf("%d",&a);

        if(a==1) add();
        else if(a==2) del();
        else if(a==3) xg();
        else if(a==4) bc();
        else if(a==0) break;
        else printf("您的输入有误，请重新输入\n");
    }
}

void cx() //成绩查找
{
    int i,item,flag;
    char s1[20]; 
    printf("**************************\n");
    printf("-----1.按学号查询-----\n");
    printf("-----2.按姓名查询-----\n");
    printf("-----3.退出本菜单-----\n");
    printf("**************************\n");
    while(1)
    {
        printf("请选择子菜单编号:");
        scanf("%d",&item);
        flag=0;
        switch(item)
        {
        case 1:
            printf("请输入要查询的学生的学号:\n");
            scanf("%s",s1);
            for(i=0;i<n;i++)
                if(strcmp(stu[i].number,s1)==0)
                {
                    flag=1;
                    printf("学号\t学生姓名 语文\t数学\t英语  \n");             
                    printf("--------------------------------------------------------------------\n");
                    printf("%s   %s   \t %d\t%d\t%d\n",stu[i].number,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english );
                }
                if(0==flag)
                    printf("该学号不存在！\n"); break;
        case 2:
            printf("请输入要查询的学生的姓名:\n");
            scanf("%s",s1);
            for(i=0;i<n;i++)
                if(strcmp(stu[i].name,s1)==0)
                {
                    flag=1;
                    printf("学号\t学生姓名 语文\t数学\t英语  \n");             
                    printf("--------------------------------------------------------------------\n");
                    printf("%s\t%s\t %d\t%d\t%d\n",stu[i].number,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english );
                }
                    if(0==flag)
                        printf("该姓名不存在！\n"); break;
        case 3:return;
        default:printf("请在1-3之间选择\n");
        }
    }
}


void tj(void)//成绩统计
{
    int a,b,c;
    int total=0;
    printf("请选择要查询的课程名称\n1.语文\n2.数学\n3.英语\n");
    scanf("%d",&a);
    printf("请选择要查询的分数段");
    scanf("%d %d",&b,&c);
    if(a==1)
    {
        for(int i=0;i<n;i++) 
        {    
            if(stu[i].chinese>=b||stu[i].chinese<=c)
            {
                printf("%s %s %d\n",stu[i].number,stu[i].name,stu[i].chinese);
                total++;
            }
        }    
    }
    if(a==2)
    {
        for(int i=0;i<n;i++) 
        {    
            if(stu[i].math>=b||stu[i].math<=c)
            {
                printf("%s %s %d\n",stu[i].number,stu[i].name,stu[i].math);
                total++;
            }
        }    
    }
    if(a==3)
    {
        for(int i=0;i<n;i++) 
        {    
            if(stu[i].english>=b||stu[i].english<=c)
            {
                printf("%s %s %d",stu[i].number,stu[i].name,stu[i].english);
                total++;
            }
        }    
    }
    printf("该分数段共有%d人\n",total);    
}

void px(void)//排序
{
    int a,b;
    printf("请选择要排序的课程名称及其升序降序\n1.语文\n2.数学\n3.英语\n4.升序\n5.降序\n");
    scanf("%d %d",&a,&b);
    if(a==1) pxc(b);
    if(a==2) pxm(b);
    if(a==3) pxe(b);
    for(int i=0;i<=n;i++)
    {
        printf("%s %s %d %d %d\n",stu[i].name,stu[i].number,stu[i].chinese ,stu[i].math ,stu[i].english);
    }
}

void pxc(int d )
{
    if(d==1)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(stu[i].chinese>stu[j].chinese)
                {
                    x[i].chinese=stu[i].chinese;
                    x[j].chinese=stu[j].chinese;
                }
                else
                {
                    x[j].chinese=stu[i].chinese;
                    x[i].chinese=stu[j].chinese;
                }
            }
        }
    }
    else
    {
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(stu[i].chinese<stu[j].chinese)
                {
                    x[i].chinese=stu[i].chinese;
                    x[j].chinese=stu[j].chinese;
                }
                else
                {
                    x[j].chinese=stu[i].chinese;
                    x[i].chinese=stu[j].chinese;
                }
            }
        }
    }

}

void pxm(int d )
{
    if(d==1)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(stu[i].math>stu[j].math)
                {
                    x[i].math=stu[i].math;
                    x[j].math=stu[j].math;
                }
                else
                {
                    x[j].math=stu[i].math;
                    x[i].math=stu[j].math;
                }
            }
        }
    }
    else
    {
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(stu[i].math<stu[j].math)
                {
                    x[i].math=stu[i].math;
                    x[j].math=stu[j].math;
                }
                else
                {
                    x[j].math=stu[i].math;
                    x[i].math=stu[j].math;
                }
            }
        }
    }
}

void pxe(int d )
{
    if(d==1)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(stu[i].english>stu[j].english)
                {
                    x[i].english=stu[i].english;
                    x[j].english=stu[j].english;
                }
                else
                {
                    x[j].english=stu[i].english;
                    x[i].english=stu[j].english;
                }
            }
        }
    }
    else
    {
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(stu[i].english<stu[j].english)
                {
                    x[i].english=stu[i].english;
                    x[j].english=stu[j].english;
                }
                else
                {
                    x[j].english=stu[i].english;
                    x[i].english=stu[j].english;
                }
            }
        }
    }
}
void add(void)//子系统 信息添加
{
    int j=n,i,flag;

    printf("请输入待增加的学生数:\n");
    scanf("%d",&m);
    if(m>0)
    {
       do
    {
        flag=1;
        while(flag)
        {
            flag=0;
            printf("请输入第%d位学生的学号(查重):\n",j+1);
            scanf("%s",stu[j].number);
            for(i=0;i<j;i++)                     /*和之前的学号比较，如果重复，重新输入*/
                if(strcmp(stu[j].number,stu[i].number)==0)
                {
                    printf("已有该学号，请重新录入\n");
                    flag=1;
                    break;                       /*如有重复，退出循环*/
                }
        }
        printf("请输入第%d 个学生的学号:\n",j+1);
        scanf("%s",stu[j].number);
        printf("请输入第%d 个学生的姓名:\n",j+1);
        scanf("%s",stu[j].name);
        printf("请输入第%d 个学生的语文成绩:\n",j+1);
        scanf("%d",&stu[j].chinese);
        printf("请输入第%d 个学生的数学成绩:\n",j+1);
        scanf(" %d",&stu[j].math);
        printf("请输入第%d 个学生的英语成绩\n",j+1);
        scanf("%d",&stu[j].english );
        if(0==flag)
        {
            j++;
        }
    }
    while(j<n+m);
    }
    n+=m;
    printf("信息增加完毕！\n\n");
}

void del(void)//子系统 信息删除
{
    int i,j,flag=0;         /* flag为0表示查找失败，为1表示查找成功*/
    char s1[20];
    printf("请输入要删除学生的学号:\n");
    scanf("%s",s1);
    for(i=0;i<n;i++)
        if(strcmp(stu[i].number,s1)==0)  /*找到要删除的学生记录*/
        {
            flag=1;                   /*查找成功*/
            for(j=i;j<n-1;j++)
            stu[j]=stu[j+1];

        }
        if(flag==0)                /*查找失败*/
            printf("该学号不存在！\n");
        if(flag==1)
        {
            printf("删除成功,显示结果请选择菜单\n");
            n--;
        }

}

void xg(void)//子系统 信息修改
{
    int i,item,num;                    /* item代表子菜单的编号，num是保存要修改信息的学生的序号*/
    char s1[20],s2[20]; 
    printf("请输入要要修改的学生的学号:\n");
    scanf("%s",s1);
    for(i=0;i<n;i++)
        if(strcmp(stu[i].number,s1)==0) /*比较字符串是否相等*/
            num=i;
        printf("------------------\n");
        printf("1.修改姓名\n");
        printf("2.修改学号\n");
        printf("3.修改语文成绩\n");
        printf("4.修改数学成绩\n");
        printf("5.修改英语成绩\n");
        printf("------------------\n");
         while(1)
        {
            printf("请选择子菜单编号:");
            scanf("%d",&item);
            switch(item)
            {
            case 1:
                printf("请输入新的姓名:\n");
                scanf("%s",s2);
                strcpy(stu[num].name,s2); break;
            case 2:
                printf("请输入新的学号:\n");
                scanf("%s",s2);
                strcpy(stu[num].number,s2); break;
            case 3:
                printf("请输入新的语文成绩:\n");
                scanf("%d",&stu[num].chinese);break;	
			case 4:
                printf("请输入新的数学成绩:\n");
                scanf("%d",&stu[num].math);break;	
            case 5:
                printf("请输入新的英语成绩:\n");
                scanf("%d",&stu[num].english);break;	
            default:printf("请在1-5之间选择\n");
            }
            printf("修改完成\n是否继续修改\n1.是\n2.不是");
            scanf("%d",&item);
            if(item==2)break;
        }
}

void shuru(void)
{

    FILE *fp;                             /* 文件指针*/
    int i=0;

    if((fp=fopen(mu,"r"))==NULL)         /* 以只读的方式打开指定文件*/
    {
        printf("打开文件错误");
        printf("请先增加学生信息在执行此操作\n");
        system("pause");
        return;
    }
     /* 循环读入学生信息*/
    while(fscanf(fp,"%s%s%d%d%d",stu[i].name,stu[i].number,&stu[i].chinese ,&stu[i].math ,&stu[i].english)==5)
    {
        i++;
    }
    n=i;
    if(0==i)
        printf("文件为空，请先选择菜单4增加学生信息\n");
    else
        printf("读入成功\n");
    fclose(fp);
}

void bc(void)
{
    int i;
    FILE *fp;
    char filename[20];
    printf("请命名要保存该信息的文件名:\n");      /*输入要保存的文件的名字*/
    scanf("%s",filename);
    fp=fopen(filename,"w");
    for(i=0;i<n;i++)
    {
        fprintf(fp,"%s\t%s\t %d\t%d\t%d\t\n",stu[i].name,stu[i].number,stu[i].chinese ,stu[i].math ,stu[i].english);
    }
    printf("保存成功\n");
    fclose(fp);
}